'''
Author: Liu Zhi Biao
Date: 2023-02-10 09:05:52
LastEditors: Liu Zhi Biao
LastEditTime: 2023-02-15 16:16:45
FilePath: \Runoob_basic\runoob1.py
Description: 

Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. 
'''
# -*- coding = utf-8 -*-
# @Time : 2023/2/10 9:05
# @Author : 龙王赘婿_彪少
# @File : runoob1.py
# @Software : PyCharm

'''
功能�?
由于学了那么久的python,只会一点点爬虫,而且还是要抄袭的那种
最基本的基础语句都懂得不�?
所以新建一个工程，稳固基础，学习新东西
目标：能够随意写出串口，网口等调试助手，能够写出一些简单工具代码，能够像盛工一样灵活运
本例抛开pycharm,用vscode编辑
本例从菜鸟驿�?
'''

import keyword
from sys import path
import operator

class Runoob:

    def __init__(self) -> None:
        # print("构造函�?")
        # self.showkeyword()
        # self.mynumber()
        # self.mystring()
        # self.myinput()
        # self.myprint()
        # self.mydata()
        # self.mydata2()
        # self.revtest()
        # self.mytuple()
        # self.myset()
        # self.mydictionary()
        # self.mydictionary2()
        # self.typechange()
        # self.listshow()
        # self.caculate()
        # self.caculate2()
        # self.caculate3()
        # self.beep()
        self.mylist2()

    def __del__(self) -> None:
        # print("析构函数")
        pass

    def showkeyword(self) -> None:
        # 打印关键�?
        print(keyword.kwlist)
        print(keyword.softkwlist)

    def mynumber(self) -> None:
        # 四种数字类型
        a = 1   # int
        b = 2.3 # float
        c = True # bool
        d = 1+2j # complex number
        print(a,b,c,d)

    def mystring(self) -> None:
        # 字符测试
        str = '0123456789'
        print(str)
        print(str[1])   # 下标�?0开�?
        print(str[1:6]) # 左闭右开
        print(str[0:-1]) # 从左向右下标 0开始，从右向左下标 -1开始，遵循左闭右开，左边下标有效，右边下标无效
        '''
            str = '0123456789'
                    |    |
                    1    6
            print(str[1,6])
            左下�?? 1 有效
            右下�?? 6 表示末尾 但不打印
            故结果为 12345
        '''
        print(str[3:])  # 输出 3开始到末尾  非常有用
        print(str[1:7:2])   # 变量[头下标，尾下标，步长]  1~7 步长2 结果 1 3 5
        print(str*4)    # 多个相乘
        print(str+"hello")  # 相加
        print(str, "world") # 自测
        print("liuzhi\nbiao")   # 带转�?
        print(r"liuzhi\nbiao")  # 转义改字符串  十分重要

    def myinput(self) -> None:
        input("\n\n 按下 enter 后退")

    def myprint(self) -> None:
        print("hello, world!")
        print("hello, world!" ,end=" jj")
        print(path)

    def mydata(self) -> None:
        # 数据类型
        count = 100 # int
        mile = 98.21 # float
        name = 'liuzhibiao' # string
        print(count, mile, name)
        a = b = c = 1
        d, e, f = 1, 2, "name"
        print(a, b, c, d, e, f)

    def mydata2(self) -> None:

        # 标准数据类型
        # 不可变数据（3 个）：Number（数字）、String（字符串）、Tuple（元组）�?
        # 可变数据�?3 个）：List（列表）、Dictionary（字典）、Set（集合）�?
        
        # 数字
        a = 1   # int
        b = 2.3 # float
        c = True # bool
        d = 1+2j # complex number
        print(a, type(a), b, type(b), c, type(c), d, type(d))
        
        print(5+4) # 加法
        print(4.3-2) # 减法
        print(3*7) # 乘法
        print(2/4) # 除法，得到一个浮点数
        print(2//4) # 除法，得到一个整�?
        print(17%3) # 取余
        print(2**5) # 乘方

        # 字符�?
        # 和之前的例子类似
        # Python的字符串，不能被改变

        # 列表 List 用的最�? 左闭右开
        list = [ 'abc', 456, 2.4, 'liuzhibiao', 34.2]
        tinylist = [888, 'zhendaqiao']

        print(list)
        print(list[0])
        print(list[1:3])
        print(list[2:])
        print(tinylist * 2)
        print(list + tinylist)

    def reversewords(self, list): 
        inputwords = list.split(" ")
        inputwords = inputwords[-1::-1]
        output = ' '.join(inputwords)
        return output
    
    def revtest(self):
        input = "I like liuzhibiao"
        rw = self.reversewords(input)
        print(rw)

    def mytuple(self):
        # 元组和列表一样，区别是无法改�?
        tuple = ('abcd', 786 , 2.23, 'runoob', 70.2)
        tinytuple = (123, 'runoob')

        print (tuple)             # 输出完整元组
        print (tuple[0])          # 输出元组的第一个元�?
        print (tuple[1:3])        # 输出从第二个元素开始到第三个元�?
        print (tuple[2:])         # 输出从第三个元素开始的所有元�?
        print (tinytuple * 2)     # 输出两次元组
        print (tuple + tinytuple) # 连接元组

        tup1 = ()    # 空元�?
        tup2 = (20,) # 一个元素，需要在元素后添加逗号


    def myset(self):
        sites = {'google', 'taobao', 'runoob', 'facebook', 'zhibu', 'baidu'}
        print(sites)

        if 'Runoob' in sites :
            print('Runoob is in the set')
        else:
            print('Runoob is not in the set')

        a = set('abracadabra')
        b = set('alacazam')
        print('a = ', a)
        print('b = ', b)
        print('a - b', a - b)
        print('a | b', a | b)
        print('a & b', a & b)
        print('a ^ b', a ^ b)
    
    def mydictionary(self):
        # 字典是一个非常有用的内置数据类型
        # 列表是有序的对象集合，字典是无序的对象集�?
        # 字典的元素是通过键来存取的，而不是通过偏移存取
        # 字典是一种映射类型，是一个无序的 �?(key):�?(value) 的集�?
        # 在同一个字典中，键(key)必须是唯一�?
        dict = {}
        dict['one'] = '1 - 菜鸟驿站'
        dict[2.2] = '2 - 菜鸟工具'
        print(dict['one'])
        print(dict[2.2])
        print(dict)
        print(dict.keys())
        print(dict.values())

    def mydictionary2(self):
        temp = dict([('one', 1), ('two', 2), ('three', 3)])
        print(temp)

    def typechange(self):
        num_int = 123
        num_flo = 1.23
        num_new = num_int + num_flo
        print("datatype of num_int: " , type(num_int))
        print("datatype of num_flo:",type(num_flo))
        print("Value of num_new:",num_new)
        print("datatype of num_new:",type(num_new))
        
        a = int(1)          # a 输出结果�? 1
        b = int(2.8)        # b 输出结果�? 2
        c = int("3")        # c 输出结果�? 3
        d = float(1)        # d 输出结果�? 1.0
        e = float(2.8)      # e 输出结果�? 2.8
        f = float("3")      # f 输出结果�? 3.0
        g = float("4.2")    # g 输出结果�? 4.2
        h = str("s1")       # h 输出结果�? 's1'
        i = str(2)          # i 输出结果�? '2'
        j = str(3.0)        # j 输出结果�? '3.0'
        print(a, b, c, d, e, f, g, h, i, j)

    def listshow(self):
        # [表达�? for 变量 in 列表]
        # [表达�? for 变量 in 列表 if 条件]
        names = ['bob', 'tom', 'alice', 'jerry', 'wendy', 'smith']
        new_names = [name.upper() for name in names if len(name) > 3]
        print(new_names)

        multiples = [str(i) for i in range(30)] # if i %3 == 0]
        print(multiples)

        # 字典推导�?
        # {key_expr: value_expr for value in collection if condition}
        listdemo = ['google', 'baidu', 'tenxun', 'taobao']
        newdict = {key: len(key) for key in listdemo}
        print(newdict)

        # 集合推导�?
        # {expression for item in sequence if condition}
        setnew = {i**2 for i in range(1,4)}
        print(setnew)

        # 判断不是abc的字母并输出
        a = {x for x in 'abracadabra' if x not in 'abc'}
        print(a)

        # 元组推导�?
        # (expression for item in sequence if condition)
        a = (x for x in range(1, 10))
        print(a)
        print(tuple(a))

    def caculate(self):
        a = 60  # 0011 1100
        b = 13  # 0000 1101
        print(a & b)
        print(a | b)
        print(a ^ b)
        print(~a)
        print(a << 2)
        print(a >> 2)

        a = 10
        b = 20
        
        if ( a and b ):
            print ("1 - 变量 a �? b 都为 true")
        else:
            print ("1 - 变量 a �? b 有一个不�? true")
        
        if ( a or b ):
            print ("2 - 变量 a �? b 都为 true，或其中一个变量为 true")
        else:
            print ("2 - 变量 a �? b 都不�? true")
        
        # 修改变量 a 的�?
        a = 0
        if ( a and b ):
            print ("3 - 变量 a �? b 都为 true")
        else:
            print ("3 - 变量 a �? b 有一个不�? true")
        
        if ( a or b ):
            print ("4 - 变量 a �? b 都为 true，或其中一个变量为 true")
        else:
            print ("4 - 变量 a �? b 都不�? true")
        
        if not( a and b ):
            print ("5 - 变量 a �? b 都为 false，或其中一个变量为 false")
        else:
            print ("5 - 变量 a �? b 都为 true")

    def caculate2(self):
        a = 10
        b = 20
        list = [1, 2, 3, 4, 5 ]
        
        if ( a in list ):
            print ("1 - 变量 a 在给定的列表�? list �?")
        else:
            print ("1 - 变量 a 不在给定的列表中 list �?")
        
        if ( b not in list ):
            print ("2 - 变量 b 不在给定的列表中 list �?")
        else:
            print ("2 - 变量 b 在给定的列表�? list �?")
        
        # 修改变量 a 的�?
        a = 2
        if ( a in list ):
            print ("3 - 变量 a 在给定的列表�? list �?")
        else:
            print ("3 - 变量 a 不在给定的列表中 list �?")

    def caculate3(self):
        a = 20
        b = 20

        if ( a is b ):
            print ("1 - a �? b 有相同的标识")
        else:
            print ("1 - a �? b 没有相同的标�?")

        if ( id(a) == id(b) ):
            print ("2 - a �? b 有相同的标识")
        else:
            print ("2 - a �? b 没有相同的标�?")

        # 修改变量 b 的�?
        b = 30
        if ( a is b ):
            print ("3 - a �? b 有相同的标识")
        else:
            print ("3 - a �? b 没有相同的标�?")

        if ( a is not b ):
            print ("4 - a �? b 没有相同的标�?")
        else:
            print ("4 - a �? b 有相同的标识")

    def beep(self):
        print("\a")

    def mylist2(self):
        # 列表的增删改�?
        templist = ['dabidou', 'bibibi', 'gogogo', 'gugu']
        print(templist)
        templist.append('daqiba')   # �?
        print(templist)
        del templist[1]             # �?
        print(templist)
        templist[3] = 'liuzhibiao'  # �?
        print(templist)
        print(templist[0])          # �?
        lenth = len(templist)       # 长度
        print(lenth)
        print(templist + ['a', 12, 'jj']) #组合
        print(['hehe'] * 4)         # 重复
        print(3 in [1, 2, 3, 4, 5]) # 存在
        for x in [1, 2, 3, 4, 5]:   # 迭代
            print(x, end='|')
        
        # 嵌套列表
        lista = ['a', 'b', 'c', 'd', 'e']
        listb = [1, 2, 3, 4, 5]
        listx = [lista, listb]
        print(listx, listx[0], listx[0][0])

        # 列表比较
        a = [1, 2]
        b = [2, 3]
        c = [2, 3]
        print("operator.eq(a,b): ", operator.eq(a,b))
        print("operator.eq(c,b): ", operator.eq(c,b))

        # 函数方法
        # len(list) 列表元素个数
        # max(list) 返回最大�?
        # min(list) 返回最小�?
        # list(seq) 元组转列�?
        # list.append(obj)
        # list.count(obj)   统计元素出现次数
        # list.extend(seq)
        # list.index(obj)   找出元素返回索引，很重要
        # list.insert(index, obj)   插入
        # list.pop([index=-1])
        # list.remove(obj)
        # list.reverse()
        # list.sort(key=None, reverse=True)
        # list.clear()
        # list.copy()

        # 集合是一个无序的不重复元素序�?




if __name__ == "__main__":
    runoob = Runoob()
